`timescale 1ns/1ps

module tb;

reg sys_clk = 1'b1;
reg sys_rst = 1'b0;
reg cpu_reset;

wire	        uart_rts;
wire	        uart_txd;

`ifdef ENABLE_DDR3

wire        ddr3_phy_init_done;
wire        ddr3_reset_n;

wire [63:0] ddr3_dq_fpga;
wire [12:0] ddr3_addr_fpga;
wire [ 2:0] ddr3_ba_fpga;
wire        ddr3_ras_n_fpga;
wire        ddr3_cas_n_fpga;
wire        ddr3_we_n_fpga;
wire        ddr3_cs_n_fpga;
wire        ddr3_odt_fpga;
wire        ddr3_cke_fpga;
wire [ 7:0] ddr3_dm_fpga;
wire [ 7:0] ddr3_dqs_p_fpga;
wire [ 7:0] ddr3_dqs_n_fpga;
wire        ddr3_ck_p_fpga;
wire        ddr3_ck_n_fpga;

`endif

integer         timeout;
reg     [639:0] dumpfilepath;

initial begin
        if ($value$plusargs("dump=%s", dumpfilepath)) begin
                $dumpfile(dumpfilepath);
                $dumpvars(0);
        end
        if ($value$plusargs("finish=%d", timeout)) begin
                #timeout $finish;
        end
end

initial #  2 sys_rst <= 1'b1;
initial #104 sys_rst <= 1'b0;
initial #  2 cpu_reset <= 1'b1;
initial #204 cpu_reset <= 1'b0;

always sys_clk = #2.500 ~sys_clk;

top #(.UART_CLK_DIV(1)) u_top(
	.sysclk_p               ( sys_clk),
	.sysclk_n               (~sys_clk),
	.sys_rst                (sys_rst),
        .cpu_reset              (cpu_reset),

	.uart_cts               (uart_rts),
	.uart_rts               (1'b1),
	.uart_rx                (uart_txd),
	.uart_tx                (1'b1)

`ifdef ENABLE_ETHMAC,
	.PHY_COL                (phy_col),
	.PHY_CRS                (phy_crs),
	.PHY_MDC                (phy_mdc),
	.PHY_MDIO               (phy_mdio),
	.PHY_RESET              (phy_reset),
	.PHY_RXCLK              (phy_rxclk),
	.PHY_RXCTL_RXDV         (phy_rxctl_rxdv),
	.PHY_RXD0               (phy_rxd0),
	.PHY_RXD1               (phy_rxd1),
	.PHY_RXD2               (phy_rxd2),
	.PHY_RXD3               (phy_rxd3),
	.PHY_RXER               (phy_rxer),
	.PHY_TXCLK              (phy_txclk),
	.PHY_TXCTL_TXEN         (phy_txctl_txen),
	.PHY_TXD0               (phy_txd0),
	.PHY_TXD1               (phy_txd1),
	.PHY_TXD2               (phy_txd2),
	.PHY_TXD3               (phy_txd3),
	.PHY_TXER               (phy_txer)
`endif
`ifdef ENABLE_DDR3,
        .ddr3_addr              (ddr3_addr_fpga),
        .ddr3_ba                (ddr3_ba_fpga),
        .ddr3_cas_n             (ddr3_cas_n_fpga),
        .ddr3_cke               (ddr3_cke_fpga),
        .ddr3_ck_n              (ddr3_ck_n_fpga),
        .ddr3_ck_p              (ddr3_ck_p_fpga),
        .ddr3_dm                (ddr3_dm_fpga),
        .ddr3_dq                (ddr3_dq_fpga),
        .ddr3_dqs_n             (ddr3_dqs_n_fpga),
        .ddr3_dqs_p             (ddr3_dqs_p_fpga),
        .ddr3_odt               (ddr3_odt_fpga),
        .ddr3_ras_n             (ddr3_ras_n_fpga),
        .ddr3_reset_n           (ddr3_reset_n),
        .ddr3_cs_n              (ddr3_cs_n_fpga),
        .ddr3_we_n              (ddr3_we_n_fpga),
        .ddr3_phy_init_done     (ddr3_phy_init_done)
`endif
);

`ifdef ENABLE_ETHMAC
eth_phy u_eth_phy(
	.m_rst_n_i(phy_reset),

	.mtx_clk_o(phy_txclk),
	.mtxd_i({phy_txd3,phy_txd2,phy_txd1,phy_txd0}),
	.mtxen_i(phy_txctl_txen),
	.mtxerr_i(phy_txer),

	.mrx_clk_o(phy_rxclk),
	.mrxd_o({phy_rxd3,phy_rxd2,phy_rxd1,phy_rxd0}),
	.mrxdv_o(phy_rxctl_rxdv),
	.mrxerr_o(phy_rxer),

	.mcoll_o(phy_col),
	.mcrs_o(phy_crs),

	.mdc_i(phy_mdc),
	.md_io(phy_mdio),

	.phy_log(32'h80000001)
);
`endif

`ifdef ENABLE_DDR3
ddr3_model_wrapper u_ddr3_model_wrapper(
  .sys_clk_i(sys_clk),
  .sys_rst(sys_rst),
  .init_calib_complete(ddr3_phy_init_done),
  .ddr3_reset_n(ddr3_reset_n),
  .ddr3_dq_fpga(ddr3_dq_fpga),
  .ddr3_addr_fpga(ddr3_addr_fpga),
  .ddr3_ba_fpga(ddr3_ba_fpga),
  .ddr3_ras_n_fpga(ddr3_ras_n_fpga),
  .ddr3_cas_n_fpga(ddr3_cas_n_fpga),
  .ddr3_we_n_fpga(ddr3_we_n_fpga),
  .ddr3_cs_n_fpga(ddr3_cs_n_fpga),
  .ddr3_odt_fpga(ddr3_odt_fpga),
  .ddr3_cke_fpga(ddr3_cke_fpga),
  .ddr3_dm_fpga(ddr3_dm_fpga),
  .ddr3_dqs_p_fpga(ddr3_dqs_p_fpga),
  .ddr3_dqs_n_fpga(ddr3_dqs_n_fpga),
  .ddr3_ck_p_fpga(ddr3_ck_p_fpga),
  .ddr3_ck_n_fpga(ddr3_ck_n_fpga)
);
`endif

endmodule
